package server.console;

import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.Parser;

import server.Configuration;
import server.exception.InterpreterException;
import server.services.ServerService;

public class ServicioInterpreter implements Interprete {
	public static final String ARG_PUERTO = "puerto";
	public static final String ARG_AYUDA = "help";
	public static final String ARG_INICIAR = "iniciar";
	public static final String ARG_PARAR = "parar";
	public static final String ARG_REINICIAR = "reiniciar";
	
	private Options options;
	private Parser parser;
	private int puerto;
	
	private ServerService service;

	public ServicioInterpreter() {
		parser = new BasicParser();
		// /////////////////////////////////////////////////////////////////////
		// Fase 1: Configuramos las opciones de validación de entrada.
		// /////////////////////////////////////////////////////////////////////
		options = new Options();
		options.addOption("p", ServicioInterpreter.ARG_PUERTO, true, "Puerto");
		options.addOption("h", ServicioInterpreter.ARG_AYUDA, false, "Imprime el mensaje de ayuda");
		service = new ServerService();
	}

	@Override
	public int interpretar(Orden comando) throws InterpreterException {
		if (!"servicio".equalsIgnoreCase(comando.getNombre()))
			return Interprete.NO_RECONOCIDO;

		// /////////////////////////////////////////////////////////////////////
		// Fase 2: Parseamos la entrada con la configuración establecida
		// /////////////////////////////////////////////////////////////////////
		try {
			String args[] = new String[comando.getArgumentos().size()];
			comando.getArgumentos().toArray(args);
			CommandLine cmdLine = this.parser.parse(this.options, args);
			
			// AYUDA
			if (cmdLine.hasOption("h")) {
				return mostrarAyuda();
			}
			
            // PUERTO          
            if (cmdLine.hasOption("p")){  
                puerto = Integer.parseInt( cmdLine.getOptionValue("p") );
            } else {  
                puerto = Configuration.PUERTO_SERVICIO;
            }
            
            if ( cmdLine.getArgs().length < 1)
            	 return mostrarAyuda();
            
            String accion = cmdLine.getArgs()[0];
            // Iniciar servidor             
            if (accion.equalsIgnoreCase(ServicioInterpreter.ARG_INICIAR)){
            	service.iniciar(puerto);
            
        	// Parar servidor             
            } else if (accion.equalsIgnoreCase(ServicioInterpreter.ARG_PARAR)){  
            	String motivo = cmdLine.getArgs().length >= 2 ? cmdLine.getArgs()[1] : "";
            	service.parar(motivo);
            
        	// Reiniciar servidor             
            } else if (accion.equalsIgnoreCase(ServicioInterpreter.ARG_REINICIAR)){
            	String motivo = cmdLine.getArgs().length >= 2 ? cmdLine.getArgs()[1] : "";
            	service.reiniciar(motivo);
            } else {
            	return mostrarAyuda();
            }
            
		} catch (ParseException e) {
			mostrarAyuda();
			throw new InterpreterException("Error en el parseo de los argumentos: "
					+ comando.getArgumentos(), e);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Hubo una excepcion " + e);
		}

		return EXITO;
	}

	@Override
	public String getTooltip(String s) {
		if ("servicio".equals(s.toLowerCase()))
			return "Maneja el servicio de chat";
		else
			return null;
	}
	
	private int mostrarAyuda() {
		new HelpFormatter().printHelp("servicio" , options);
		return Interprete.EXITO;
	}

}
